package com.stedu.mall.goodsservice.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.stedu.mall.common.bean.Category;
import com.stedu.mall.common.exception.SteduException;
import com.stedu.mall.common.service.CategoryService;
import com.stedu.mall.goodsservice.mapper.CategoryMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {
    /*
     * 这个类是商品服务中的分类服务实现类，实现了 CategoryService 接口。
     * 主要功能包括分类的添加、修改、删除、根据条件查询（支持分页和不分页）以及根据 ID 查询单个分类。
     *
     * -- 添加 --
     * 1、判断被添加的分类对应的父分类是否存在
     * 2、所有父分类不能重名
     * 3、同一个父分类的下的分类不能重名
     * -- 删除 --
     * 1、判断是否存在
     * 2、如果当前是父分类，判断是否存在子分类
     * 3、TODO 判断子分类下面是否存在商品
     * -- 修改 --
     * 1、判断是否存在
     * 2、如果当前分类是父分类且存在子分类，需要修改为子分类，禁止
     * 3、如果当前是父分类，并将自己设置为自己的父分类，禁止
     * 4、修改之后的名字不能和相同父分类下的子分类名字重复
     */

    // 自动注入 CategoryMapper，用于数据库操作
    @Autowired
    private CategoryMapper categoryMapper;

    // 添加分类方法
    @Override
    public boolean insert(Category category) throws SteduException {
        // 如果被添加的分类有父分类（不是顶级分类）
        if (!category.getParentId().equals(0)) {
            // 查询父分类是否存在且不是子分类（因为如果父分类本身也是子分类，那就不合法）
            Category parent = categoryMapper.selectById(category.getParentId());
            if (parent == null || (parent!= null &&!parent.getParentId().equals(0))) {
                // 如果父分类不存在或不合法，抛出异常表示添加失败
                throw new SteduException("添加失败，被添加的分类的父分类不存在或不合法,请修改！");
            }
        }
        // 查询指定父分类下的所有分类，判断是否有重名
        List<Category> categoryList = categoryMapper.selectByParentId(category.getParentId());
        boolean flag = categoryList.stream()
                .anyMatch(item -> item.getName().equals(category.getName()));
        if (flag) {
            // 如果有重名，抛出异常表示添加失败
            throw new SteduException("添加失败，当前分类下已存在同名分类，请修改！");
        }
        // 执行插入操作，返回插入是否成功（插入成功返回 true）
        return categoryMapper.insert(category) == 1;
    }

    // 修改分类方法
    @Override
    public boolean update(Category category) throws SteduException {
        // 查询被修改分类的详细信息
        Category oldInfo = categoryMapper.selectById(category.getId());
        Category newInfo = category;
        // 判断被修改的分类是否存在
        if (oldInfo == null) {
            // 如果不存在，抛出异常表示修改失败
            throw new SteduException("修改失败，该分类不存在！");
        }
        // 如果当前分类是父分类且存在子分类，并且要修改为子分类，禁止修改
        if (oldInfo.getParentId().equals(0) && oldInfo.getChildList().size() > 0 && (newInfo.getParentId()!= null &&!newInfo.getParentId().equals(0))) {
            throw new SteduException("修改失败，当前分类为父分类且存在子分类，禁止修改！");
        }
        // 如果当前是父分类，并将自己设置为自己的父分类，禁止修改
        if (oldInfo.getParentId().equals(0) &&!newInfo.getParentId().equals(0) && newInfo.getParentId().equals(oldInfo.getId())) {
            throw new SteduException("修改失败，禁止设置当前分类为自己的父分类！");
        }
        //获取修改后的父分类的ID
        Integer parentId = newInfo.getParentId() == null ? oldInfo.getParentId() : newInfo.getParentId();
        //获取修改之后的名字
        String name = newInfo.getName() == null ? oldInfo.getName() : newInfo.getName();
        //查询修改之后的同一个父类下所有的子分类
        if (categoryMapper.selectByParentId(parentId).stream()
                .anyMatch(item -> item.getName().equals(name) && !item.getId().equals(category.getId()))) {
            throw new SteduException("修改失败，当前分类下已存在同名分类！");
        }
        // 执行更新操作，返回更新是否成功（更新成功返回 true）
        return categoryMapper.update(category) == 1;
    }

    // 删除分类方法
    @Override
    public boolean delete(Integer id) throws SteduException {
        // 判断要删除的分类是否存在
        Category category = categoryMapper.selectById(id);
        if (category == null) {
            // 如果不存在，抛出异常表示删除失败
            throw new SteduException("该分类不存在删除失败!");
        }
        // 如果当前是父分类，判断是否存在子分类
        if (category.getParentId() == 0 && category.getChildList().size() > 0) {
            throw new SteduException("删除失败，该分类存在关联子分类！");
        }
        // TODO 判断子分类下面是否存在商品
        // 执行删除操作，返回删除是否成功（删除成功返回 true）
        return categoryMapper.delete(id) == 1;
    }

    // 分页和不分页查询方法
    @Override
    public Object selectByCondition(Category condition, Integer pageNum, Integer pageSize) {
        if (pageNum == null) {
            // 不分页的查询
            return categoryMapper.selectByCondition(condition);
        } else {
            // 分页的查询
            // 设置分页参数
            PageHelper.startPage(pageNum, pageSize);
            // 查询
            List<Category> categories = categoryMapper.selectByCondition(condition);
            // 创建分页信息的对象
            PageInfo<Category> pageInfo = new PageInfo<>(categories);
            return pageInfo;
        }
    }

    // 根据 ID 查询单个分类方法
    @Override
    public Category selectById(Integer id) {
        return categoryMapper.selectById(id);
    }
}
